bits 32
; __declspec(naked) DWORD __fastcall ReleaseOccupiedBit(int dwBitOffset, LPDWORD lpdwBitmap)
; ecx = nBitOffset
; edx = lpdwBitmap
global ReleaseOccupiedBit
ReleaseOccupiedBit:
    mov eax, ecx
    shr eax, 5 ; ecx = nBitOffset / 32 第几个 dword
    and ecx, 0x1F ; eax = nBitOffset % 32 dword 内的第几位
    bts dword [edx + eax * 4], ecx ; 将 dword 内需要释放的位置位，原值保存在 CF 中
    jc ReleaseOccupiedBit.AlreadySet ; 原本已经置位
    ret ; 成功释放指定位，返回指定位的偏移（可用于设置索引）
ReleaseOccupiedBit.AlreadySet:
    mov eax, -1 ; 返回 0xFFFFFFFF 表示错误
    ret